package br.com.cpqd.ssar.posprocessamento;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.util.StringTokenizer;
import java.util.Vector;

class readingFileAreaSAR {

    private Vector listCubeElements = new Vector();
    private CubeElement nCube;
    private Temporizador t;
    private char[] line = null;
    private String[] vline = null;
    private String caminho;
    private Double maiorCampo = 0.0;
    private Double menorCampo = 0.0;
    private StringTokenizer st;
    private int numPassos,  numMalha;
    private FileInputStream is;                 // Stream de Entrada
    private BufferedReader br;                  // Buffer de leitura
    private Double cor;

    public readingFileAreaSAR() {
    }

    public Vector reading(String fileNameMovie3d) throws FileNotFoundException, IOException {
        String s;
        
        Renderizador r = new Renderizador();
        t = new Temporizador();

        // definindo maior e menor campo
        try {

            is = new FileInputStream(fileNameMovie3d);
            br = new BufferedReader(new InputStreamReader(is));

            //converte a linha de char para string
            while ((s = br.readLine()) != null) {

                if (!s.contains("time")) {

                    //divide essa string em x,y,z e campo
                    vline = split(s);
                    //define maior e menor campo para calcular 'range'
                    if (maiorCampo < Double.parseDouble(vline[3])) {
                        maiorCampo = Double.parseDouble(vline[3]);

                    }
                    if (menorCampo > Double.parseDouble(vline[3])) {
                        menorCampo = Double.parseDouble(vline[3]);
                    }
                }
            }
            is.close();
            br.close();

        } catch (IOException exc) {
            System.out.println(exc);
            System.exit(1);
        }


        t = new Temporizador();
        System.out.println("Maior Campo: " + maiorCampo);
        System.out.println("Menor Campo: " + menorCampo);


        //lendo o arquivo e criando malha 3D de resultados
        try {
            is = new FileInputStream(fileNameMovie3d);
            br = new BufferedReader(new InputStreamReader(is));

            while (!(s = br.readLine()).contains("time")) {

                //divide essa string em x,y,z e campo
                vline = split(s);
                //cria o novo cubo adquirido da n linha
               // cor = setColorField(Double.parseDouble(vline[4]));
                //System.out.println("cor: " + cor);
//                if (cor == null) {
//                    cor = 0.0;
//                }
                
                if (Double.parseDouble(vline[3]) != 0.0d) {
                    nCube = new CubeElement(Double.parseDouble(vline[0]), Double.parseDouble(vline[1]), Double.parseDouble(vline[2]), Double.parseDouble(vline[3]));
                    listCubeElements.add(nCube);
                //System.out.println("add");
                }

            }
            
            is.close();
            br.close();


        } catch (IOException exc) {
            System.out.println(exc);
            System.exit(1);
        }
        
        return listCubeElements;
    }

    public String[] split(String sentence) {
        //vetor que contem x,y,z e campo

        String[] tokens = null;

        String splitPattern = " ";

        tokens = sentence.split(splitPattern);

        if (tokens == null) {
            String msg = "   NO MATCH: pattern:" + sentence + "\r\n             regex: " + splitPattern;
        } else {
            return tokens;
        }
        return tokens;

    }

    public Double setColorField(Double campo) {

        Double range;
        Double passo;
        Double RGB = 255.0;

        range = Math.abs(menorCampo) + Math.abs(maiorCampo);
        
        // primeiro caso
        if ((menorCampo < 0) && (maiorCampo > 0) && (campo < 0)) {

            range = Math.abs(menorCampo) + Math.abs(maiorCampo);
            passo = range / RGB; //rangeCor = 255 RGB
            cor = (Math.abs(menorCampo - campo) / passo) / 255;


        }

        if ((menorCampo < 0.0) && (maiorCampo > 0.0) && (campo > 0.0)) {
            range = Math.abs(menorCampo) + Math.abs(maiorCampo);
            passo = range / RGB;
            cor = (Math.abs(-menorCampo + campo) / passo) / 255;


        }

        if ((menorCampo > 0.0) && (maiorCampo > 0.0) && (campo > 0.0)) {
            range = maiorCampo - menorCampo;
            cor = (((Math.abs(campo - menorCampo) * RGB) / range) * (RGB / range)) / 255;


        }
        return cor;

    }
    
    public Double getRange(){
        return Math.abs(maiorCampo - menorCampo);
    }
    
    public Double getMaiorCampo(){
        return maiorCampo;
    }
    
    public Double getMenorcampo(){
        return menorCampo;
    }

    public int[] getConfigMalha() {
        int[] configMalha = new int[2];
        configMalha[0] = this.numPassos;
        configMalha[1] = this.numMalha;
        return configMalha;
    }
}

